package cn.com.w.bootfreemarker.util;

import lombok.extern.slf4j.Slf4j;

import java.net.*;
import java.util.Enumeration;

/**
 * InetAddress是Java对IP地址的封装，在java.net中有许多类都使用到了InetAddress，
 * 包括ServerSocket，Socket，DatagramSocket等等。
 * <p>
 * InetAddress的实例对象包含以数字形式保存的IP地址，同时还可能包含主机名（如果使用主机名来获取InetAddress的实例，
 * 或者使用数字来构造，并且启用了反向主机名解析的功能）。
 */
@Slf4j
public class InetIpUtil {


    /**
     * 获取本地ipv4地址
     *
     * @return
     */
    public static String getInet4Address() {
        Enumeration<NetworkInterface> nis;
        String ip = null;
        try {
            nis = NetworkInterface.getNetworkInterfaces();
            while (nis.hasMoreElements()) {
                // 存在NetworkInterface对象
                NetworkInterface ni = nis.nextElement();
                Enumeration<InetAddress> ias = ni.getInetAddresses();
                // 该网卡接口下的ip会有多个，也需要一个个的遍历，找到自己所需要的。
                while (ias.hasMoreElements()) {
                    // 存在InetAddress对象
                    InetAddress ia = ias.nextElement();
                    if (!ia.isLinkLocalAddress()
                            && !ia.isLoopbackAddress()
                            && ia instanceof Inet4Address) {
                        // 以文本形式返回IP地址字符串
                        ip = ia.getHostAddress();
                        System.out.println("网卡接口名称：" + ni.getName());
                        System.out.println("网卡接口地址：" + ia.getHostAddress());
                        System.out.println("网卡主机名称：" + ia.getHostName());
                    }
                }
            }
        } catch (SocketException e) {
            log.error("[获取本地真实ip发生错误]", e);
        }
        return ip;
    }

}
